package cn.com.nes.site.service.project;

import cn.com.nes.mybatis.agent.project.entity.ProjectServiceUserAuth;
import cn.com.nes.mybatis.agent.system.entity.TUser;
import cn.com.nes.site.controller.project.vo.*;
import cn.com.nes.site.entity.PageData;
import cn.com.nes.site.entity.bo.project.ProjectServiceUserAuthPageBO;
import cn.com.nes.site.service.project.bo.EnableProjectServiceUserBO;
import cn.com.nes.site.service.project.bo.QRCodeForSaveServiceUserBO;
import cn.com.nes.site.service.project.bo.SaveProjectServiceUserBO;
import cn.com.nes.site.service.project.bo.SetProjectServiceUserAreaCodeBO;
import cn.com.nes.site.service.project.dto.MyTeamInfoDTO;
import cn.com.nes.site.service.project.dto.MyTeamWorkAreaDTO;
import cn.com.nes.site.service.project.dto.ProjectServiceUserDTO;
import cn.com.nes.site.service.project.dto.QRCodeInfoDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface ProjectServiceUserAuthService extends IService<ProjectServiceUserAuth> {

    /**
     * 查询项目服务人员分页列表
     */
    Page<ProjectServiceUserDTO> getProjectServiceUserPage(
            ProjectServiceUserAuthPageBO projectServiceUserAuthPageBO) throws Exception;


    /**
     * 查询项目服务人员分页列表
     */
    Page<ProjectServiceUserDTO> getProjectServiceUserAuthPage(ProjectServiceUserAuthPageBO bo) throws Exception;


    /**
     * 保存项目服务人员
     */
    PageData saveProjectServiceUser(SaveProjectServiceUserBO vo) throws Exception;


    /**
     * 启用/停用项目服务人员权限
     */
    void enableProjectServiceUserAuth(EnableProjectServiceUserBO bo) throws Exception;


    /**
     * 删除项目服务人员
     */
    PageData delProjectServiceUser(DelProjectServiceUserVO vo) throws Exception;


    /**
     * 查询项目服务负责人列表 - 不分页
     */
    List<ProjectServiceUserDTO> getConstructionSupervisorList(GetConstructionSupervisorListVO vo);


    /**
     * 查询我的施工队列表
     */
    List<MyTeamInfoDTO> getMyTeamInfoList(GetMyTeamInfoVO vo);


    /**
     * 我的施工队的项目列表
     */
    List<Map<String, String>> getMyTeamProjectList(GetMyTeamProjectVO vo) throws Exception;


    /**
     * 我的施工队的队员列表
     * 查询施工团队中的已启用的服务人员
     */
    List<Map<String, Object>> getMyTeamMemberList(GetMyTeamMemberVO vo, Boolean retainCaptain) throws Exception;


    /**
     * 我的施工队负责的区域信息
     */
    List<MyTeamWorkAreaDTO> getMyTeamWorkArea(GetMyTeamWorkAreaVO vo) throws Exception;


    /**
     * 根据项目id查询用户id
     */
    Long getUserIdByProjectId(Long projectId, Long easyRepairUserId, Boolean isCaptain);


    /**
     * 查询施工队员的工作区域
     */
    List<MyTeamWorkAreaDTO> getTeamMemberWorkArea(List<Long> teamMemberIdList, String projectUuid);


    /**
     * 查询施工队员的工作区域编码
     */
    List<String> getTeamMemberWorkAreaCode(List<Long> teamMemberIdList, String projectUuid,
            boolean getChildArea) throws Exception;


    /**
     * 查询二维码信息
     * @param vo
     * @return
     */
    QRCodeInfoDTO getQRCodeInfo(GetProjectQRCodeInfoVO vo) throws Exception;


    /**
     * 扫描二维码保存项目服务人员
     * @param qrCodeForSaveServiceUserBO
     */
    PageData qRCodeForSaveProjectServiceUser(QRCodeForSaveServiceUserBO qrCodeForSaveServiceUserBO) throws Exception;


    /**
     * 获取用户的施工负责人权限
     * @param easyRepairUserId 易修用户ID
     * @return
     */
    List<ProjectServiceUserAuth> getHeadAuth(Long easyRepairUserId) throws Exception;


    /**
     * 校验用户是否具有施工负责人权限
     * @param easyRepairUserId 易修用户ID
     * @return
     */
    boolean validateHeadAuth(Long easyRepairUserId) throws Exception;


    /**
     * 设置项目服务人员行政区划
     * @param bo
     */
    void setProjectServiceUserAreaCode(SetProjectServiceUserAreaCodeBO bo) throws Exception;


    /**
     * 查询项目服务人员服务行政区划代码
     */
    List<String> getServiceUserAllAreaCodes(Long serviceUserId, String projectUuid) throws Exception;


    /**
     * 查询服务人员配置信息
     */
    boolean validateBelongToTeam(Long userId, String projectUuid) throws Exception;


    /**
     * 查询我在某个项目下的施工队成员配置信息
     */
    List<ProjectServiceUserDTO> getTeamUserAuthList(Long userId, String projectUuid) throws Exception;


    /**
     * 查询有行政区划代码权限的施工队成员id
     */
    Set<Long> getTeamUserIdList(Long userId, String projectUuid, String areaCode) throws Exception;


    List<ProjectServiceUserAuth> getProjectServiceUsers(String projectUuid) throws Exception;


    /**
     * 校验当前登录人是否是当前项目的施工队长
     */
    boolean validateHeadAuth(Long userId, String projectUuid);


    /**
     * 查询我的队长
     */
    TUser getMyCaptain(Long userId, String projectUuid) throws Exception;

}
